/*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/

package main

import (
    "net"
    "log"
    "fmt"
    "reflect"
    "io"
)

func main() {
    addr := "wwww.baidu.com:80" //定义主机名
    conn,err := net.Dial("tcp",addr) //拨号操作，需要指定协议。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("访问公网IP地址是：",conn.RemoteAddr().String()) /*获取“conn”中的公网地址。注意：最好是加上后面的String方法，因为他们的那些是不一样的哟·当然你打印的时候
    可以不加输出结果是一样的，但是你的内心是不一样的哟！*/
    fmt.Printf("客户端链接的地址及端口是：%v\n",conn.LocalAddr()) //获取到本地的访问地址和端口。
    fmt.Println("“conn.LocalAddr()”所对应的数据类型是：",reflect.TypeOf(conn.LocalAddr()))
    fmt.Println("“conn.RemoteAddr().String()”所对应的数据类型是：",reflect.TypeOf(conn.RemoteAddr().String()))
    n,err := conn.Write([]byte("GET / HTTP/1.1\r\n\r\n")) //向服务端发送数据。用n接受返回的数据大小，用err接受错误信息。
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("向服务端发送的数据大小是:",n)

    buf := make([]byte,1024) //定义一个切片的长度是1024。

    n,err = conn.Read(buf) //接收到的内容大小。

    if err != nil && err != io.EOF {  //io.EOF在网络编程中表示对端把链接关闭了。
        log.Fatal(err)
    }
    fmt.Println(string(buf[:n])) //将接受的内容都读取出来。
    conn.Close()  //断开TCP链接。
}

/*

#以上代码输出结果如下：
访问公网IP地址是： 111.13.101.208:80
客户端链接的地址及端口是：172.16.3.210:49568
“conn.LocalAddr()”所对应的数据类型是： *net.TCPAddr
“conn.RemoteAddr().String()”所对应的数据类型是： string
向服务端发送的数据大小是: 18
HTTP/1.1 400 Bad Request
Date: Mon, 31 Jul 2017 06:22:41 GMT
Server: Apache
Content-Length: 226
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
*/

